package sword_offer;

/**
 * @author Synhard
 * @version 1.0
 * @Class sword_offer.Code14
 * @Description 请实现一个函数，输入一个整数（以二进制串形式），输出该数二进制表示中 1 的个数。例如，把 9 表示成二进制是 1001，有 2 位是 1。因此，如果输入 9，则该函数输出 2。
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-03-14 14:43
 */
public class Code14 {
    public static int hammingWeight(int n) {
        int counter = 0;
        System.out.println(n);
        while (n != 0) {
            if ((n & 1) == 1) {
                counter++;
            }
            n >>>= 1;
            System.out.println(n);
        }
        return counter;
    }

    public static void main(String[] args) {
        System.out.println(hammingWeight(0b11111111111111111111111111111111));
    }
}
/*
根据与运算的定义，设二进制数字n则有
若 n & 1 = 0，则 n 二进制 最右一位 为 0 ；
若 n & 1 = 1，则 n 二进制 最右一位 为 1 ；
int 的类型是带符号的整数，因此 int a = 0b1011; a的值为-3
所以while循环中的条件必须写成n != 0 不能写成 n > 0
底层存储都是按照补码存储，因此32位1 最后的int值为-1
 */